/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GUI;

import Threads.HiloEspera;
import Threads.HiloMatlab;
import Logic.EscritorArchivoTXTdePPF;
import Logic.LectorArchivoPPF;
import Logic.LectorArchivoMLC;
import Logic.EscritorArchivoTXTdeMLC;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Image;
import java.awt.Toolkit;
import java.io.*;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import javax.swing.filechooser.FileNameExtensionFilter;
import matlabcontrol.MatlabConnectionException;
import matlabcontrol.MatlabInvocationException;

/**
 *
 * @author Ramiro
 */
public class Principal extends javax.swing.JFrame {

    private String ruta; //ruta del archivo seleccionado al pulsar el botón Abrir
    private Vector matrizMLC; //matriz usada para cargar los datos del archivo mlc
    private Vector matrizPPF; //matriz usada para cargar los datos del archivo PPF
    private String paciente; //nombre del paciente al cual pertenece el archivo abierto
    private File archivoElegido; //archivo PPF elegido para estudiar con sus resp MLC
    private File archivoMLC; //archivo MLC que se abre a partir del PPF y de la selección
    private String nombreArchivo; //nombre del archivo seleccionado
    private String nombreMLC = ""; //nombre del archivo MLC a estudiar
    private String nombrePPF = ""; //nombre del archivo PPF abierto
    private int campoElegido = 0;

    /**
     * Creates new form Principal
     */
    public Principal() {

        initComponents();

        this.setExtendedState(JFrame.MAXIMIZED_BOTH);

        this.BotonEjecutarAnalisis.setEnabled(false);
        this.BotonResultados.setEnabled(false);
        this.Campos.removeAllItems();
        this.Campos.setEnabled(false);
        this.SelectCampos.setEnabled(false);
        this.setLocationRelativeTo(null);
        this.dCorrectionPaciente.setEnabled(false);
        this.diagPaciente.setEnabled(false);
        this.equipoPaciente.setEnabled(false);
        this.idPaciente.setEnabled(false);
        this.nombrePaciente.setEnabled(false);
        this.fechaDiagPaciente.setEnabled(false);

        Image retValue = Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource("IMG/mlc1.jpg"));
        image.setIcon(new ImageIcon(retValue.getScaledInstance(image.getWidth(), image.getHeight(), Image.SCALE_AREA_AVERAGING)));


    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @Override
    public Image getIconImage() {
        Image retValue = Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource("IMG/3-400.png"));
        return retValue;
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        ArchPPFElegido = new javax.swing.JTextField();
        BotonEjecutarAnalisis = new javax.swing.JButton();
        FirmaVentana = new javax.swing.JTextField();
        BotonResultados = new javax.swing.JButton();
        SelectCampos = new javax.swing.JTextField();
        Campos = new javax.swing.JComboBox();
        ArchMLCElegido = new javax.swing.JTextField();
        nombrePaciente = new javax.swing.JTextField();
        diagPaciente = new javax.swing.JTextField();
        idPaciente = new javax.swing.JTextField();
        fechaDiagPaciente = new javax.swing.JTextField();
        equipoPaciente = new javax.swing.JTextField();
        dCorrectionPaciente = new javax.swing.JTextField();
        nombrePacienteEdit = new javax.swing.JTextField();
        diagPacienteEdit = new javax.swing.JTextField();
        equipoPacienteEdit = new javax.swing.JTextField();
        idPacienteEdit = new javax.swing.JTextField();
        fechaDiagEdit = new javax.swing.JTextField();
        dCorrectionEdit = new javax.swing.JTextField();
        jSeparator1 = new javax.swing.JSeparator();
        jSeparator2 = new javax.swing.JSeparator();
        BotonAbrir = new javax.swing.JButton();
        image = new javax.swing.JLabel();
        MensajesSistema = new javax.swing.JTextField();
        TituloVentana = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Proyecto Final ISI - Burgos, Scarafia - IMRT");
        setAlwaysOnTop(true);
        setIconImage(getIconImage());
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        ArchPPFElegido.setEditable(false);
        ArchPPFElegido.setBackground(new java.awt.Color(215, 215, 215));
        ArchPPFElegido.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        ArchPPFElegido.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        ArchPPFElegido.setBorder(null);
        ArchPPFElegido.setFocusable(false);
        ArchPPFElegido.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ArchPPFElegidoActionPerformed(evt);
            }
        });

        BotonEjecutarAnalisis.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        BotonEjecutarAnalisis.setText("Realizar análisis");
        BotonEjecutarAnalisis.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotonEjecutarAnalisisActionPerformed(evt);
            }
        });

        FirmaVentana.setEditable(false);
        FirmaVentana.setBackground(new java.awt.Color(215, 215, 215));
        FirmaVentana.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N
        FirmaVentana.setForeground(new java.awt.Color(0, 51, 255));
        FirmaVentana.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        FirmaVentana.setText("Proyecto Final ISI - Burgos, Scarafia - IMRT");
        FirmaVentana.setBorder(null);
        FirmaVentana.setFocusable(false);
        FirmaVentana.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                FirmaVentanaActionPerformed(evt);
            }
        });

        BotonResultados.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        BotonResultados.setText("Ver Cálculo de Dosis");
        BotonResultados.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotonResultadosActionPerformed(evt);
            }
        });

        SelectCampos.setEditable(false);
        SelectCampos.setBackground(new java.awt.Color(215, 215, 215));
        SelectCampos.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        SelectCampos.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        SelectCampos.setText("Seleccione el Campo a estudiar:");
        SelectCampos.setBorder(null);
        SelectCampos.setFocusable(false);
        SelectCampos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                SelectCamposActionPerformed(evt);
            }
        });

        Campos.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        Campos.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        Campos.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                CamposMouseClicked(evt);
            }
        });
        Campos.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                CamposItemStateChanged(evt);
            }
        });
        Campos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                CamposActionPerformed(evt);
            }
        });

        ArchMLCElegido.setEditable(false);
        ArchMLCElegido.setBackground(new java.awt.Color(215, 215, 215));
        ArchMLCElegido.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        ArchMLCElegido.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        ArchMLCElegido.setBorder(null);
        ArchMLCElegido.setFocusable(false);
        ArchMLCElegido.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                ArchMLCElegidoMouseClicked(evt);
            }
        });
        ArchMLCElegido.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ArchMLCElegidoActionPerformed(evt);
            }
        });

        nombrePaciente.setEditable(false);
        nombrePaciente.setBackground(new java.awt.Color(215, 215, 215));
        nombrePaciente.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        nombrePaciente.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        nombrePaciente.setText("Paciente:");
        nombrePaciente.setBorder(null);
        nombrePaciente.setFocusable(false);

        diagPaciente.setEditable(false);
        diagPaciente.setBackground(new java.awt.Color(215, 215, 215));
        diagPaciente.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        diagPaciente.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        diagPaciente.setText("Diagnóstico:");
        diagPaciente.setBorder(null);
        diagPaciente.setFocusable(false);

        idPaciente.setEditable(false);
        idPaciente.setBackground(new java.awt.Color(215, 215, 215));
        idPaciente.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        idPaciente.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        idPaciente.setText("ID del Paciente:");
        idPaciente.setBorder(null);
        idPaciente.setFocusable(false);

        fechaDiagPaciente.setEditable(false);
        fechaDiagPaciente.setBackground(new java.awt.Color(215, 215, 215));
        fechaDiagPaciente.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        fechaDiagPaciente.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        fechaDiagPaciente.setText("Fecha de diagnóstico:");
        fechaDiagPaciente.setBorder(null);
        fechaDiagPaciente.setFocusable(false);

        equipoPaciente.setEditable(false);
        equipoPaciente.setBackground(new java.awt.Color(215, 215, 215));
        equipoPaciente.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        equipoPaciente.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        equipoPaciente.setText("Tipo de Equipo:");
        equipoPaciente.setBorder(null);
        equipoPaciente.setFocusable(false);

        dCorrectionPaciente.setEditable(false);
        dCorrectionPaciente.setBackground(new java.awt.Color(215, 215, 215));
        dCorrectionPaciente.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        dCorrectionPaciente.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        dCorrectionPaciente.setText("Density Correction:");
        dCorrectionPaciente.setBorder(null);
        dCorrectionPaciente.setFocusable(false);

        nombrePacienteEdit.setEditable(false);
        nombrePacienteEdit.setBackground(new java.awt.Color(215, 215, 215));
        nombrePacienteEdit.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        nombrePacienteEdit.setBorder(null);
        nombrePacienteEdit.setFocusable(false);

        diagPacienteEdit.setEditable(false);
        diagPacienteEdit.setBackground(new java.awt.Color(215, 215, 215));
        diagPacienteEdit.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        diagPacienteEdit.setBorder(null);
        diagPacienteEdit.setFocusable(false);

        equipoPacienteEdit.setEditable(false);
        equipoPacienteEdit.setBackground(new java.awt.Color(215, 215, 215));
        equipoPacienteEdit.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        equipoPacienteEdit.setBorder(null);
        equipoPacienteEdit.setFocusable(false);

        idPacienteEdit.setEditable(false);
        idPacienteEdit.setBackground(new java.awt.Color(215, 215, 215));
        idPacienteEdit.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        idPacienteEdit.setBorder(null);
        idPacienteEdit.setFocusable(false);

        fechaDiagEdit.setEditable(false);
        fechaDiagEdit.setBackground(new java.awt.Color(215, 215, 215));
        fechaDiagEdit.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        fechaDiagEdit.setBorder(null);
        fechaDiagEdit.setFocusable(false);

        dCorrectionEdit.setEditable(false);
        dCorrectionEdit.setBackground(new java.awt.Color(215, 215, 215));
        dCorrectionEdit.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        dCorrectionEdit.setBorder(null);
        dCorrectionEdit.setFocusable(false);

        BotonAbrir.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        BotonAbrir.setText("Abrir planificación paciente (PPF)");
        BotonAbrir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotonAbrirActionPerformed(evt);
            }
        });

        MensajesSistema.setEditable(false);
        MensajesSistema.setBackground(new java.awt.Color(215, 215, 215));
        MensajesSistema.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        MensajesSistema.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        MensajesSistema.setBorder(null);
        MensajesSistema.setFocusable(false);
        MensajesSistema.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MensajesSistemaActionPerformed(evt);
            }
        });

        TituloVentana.setEditable(false);
        TituloVentana.setBackground(new java.awt.Color(215, 215, 215));
        TituloVentana.setFont(new java.awt.Font("Tahoma", 0, 36)); // NOI18N
        TituloVentana.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        TituloVentana.setText("IMRT - VeSoft");
        TituloVentana.setBorder(null);
        TituloVentana.setFocusable(false);
        TituloVentana.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                TituloVentanaActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jSeparator2)
                        .addContainerGap())
                    .addComponent(jSeparator1)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(121, 121, 121)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(diagPaciente, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(equipoPaciente, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(nombrePaciente, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addComponent(diagPacienteEdit, javax.swing.GroupLayout.DEFAULT_SIZE, 220, Short.MAX_VALUE)
                                .addComponent(equipoPacienteEdit, javax.swing.GroupLayout.DEFAULT_SIZE, 220, Short.MAX_VALUE))
                            .addComponent(nombrePacienteEdit, javax.swing.GroupLayout.PREFERRED_SIZE, 220, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(idPaciente, javax.swing.GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE)
                            .addComponent(fechaDiagPaciente, javax.swing.GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE)
                            .addComponent(dCorrectionPaciente, javax.swing.GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(idPacienteEdit, javax.swing.GroupLayout.DEFAULT_SIZE, 220, Short.MAX_VALUE)
                            .addComponent(fechaDiagEdit, javax.swing.GroupLayout.DEFAULT_SIZE, 220, Short.MAX_VALUE)
                            .addComponent(dCorrectionEdit, javax.swing.GroupLayout.DEFAULT_SIZE, 220, Short.MAX_VALUE))
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(ArchPPFElegido)
                        .addContainerGap())
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(ArchMLCElegido)
                        .addContainerGap())
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(MensajesSistema)
                            .addComponent(FirmaVentana, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 0, Short.MAX_VALUE)
                            .addComponent(TituloVentana, javax.swing.GroupLayout.Alignment.TRAILING))
                        .addContainerGap())))
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(image, javax.swing.GroupLayout.PREFERRED_SIZE, 439, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                            .addComponent(SelectCampos, javax.swing.GroupLayout.PREFERRED_SIZE, 250, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(Campos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGap(56, 56, 56)))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(135, 135, 135)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(BotonResultados, javax.swing.GroupLayout.PREFERRED_SIZE, 170, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(BotonEjecutarAnalisis, javax.swing.GroupLayout.PREFERRED_SIZE, 170, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addGap(0, 0, Short.MAX_VALUE))
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(BotonAbrir)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(FirmaVentana, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(TituloVentana, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(BotonAbrir, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(20, 20, 20)
                .addComponent(ArchPPFElegido, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(2, 2, 2)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(nombrePacienteEdit, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(nombrePaciente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(idPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(idPacienteEdit, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(diagPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(fechaDiagPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(diagPacienteEdit, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(fechaDiagEdit, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(equipoPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(dCorrectionPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(equipoPacienteEdit, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(dCorrectionEdit, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 18, Short.MAX_VALUE)
                .addComponent(image, javax.swing.GroupLayout.PREFERRED_SIZE, 212, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(Campos, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(SelectCampos, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(ArchMLCElegido, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(1, 1, 1)
                .addComponent(BotonEjecutarAnalisis, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(BotonResultados, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(MensajesSistema, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(45, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void FirmaVentanaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_FirmaVentanaActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_FirmaVentanaActionPerformed

    /*
     * Función que luego de abrir un archivo MLC, guarda los datos extraídos en un archivo
     * de texto para luego ser tratado por MatLab
     */
    private void generarArchivoTXT() throws FileNotFoundException, IOException, Exception {
        //Abro el archivo MLC correspondiente
        try {
            //Guardo los datos del PPF seleccionado
            EscritorArchivoTXTdePPF file1 = new EscritorArchivoTXTdePPF(ruta);
            file1.GuardarArchivo(matrizPPF, nombrePPF);

            this.archivoMLC = new File(archivoElegido.getParent() + "\\" + nombreMLC);
            LectorArchivoMLC lector2 = new LectorArchivoMLC(archivoMLC.getPath());//Asocio el archivo con el lector de archivos para sacar la info
            this.matrizMLC = lector2.AbrirArchivo();
            this.paciente = lector2.getNombrePaciente();
            

            //Comienzo a guardar el txt con los datos extraídos del MLC
            EscritorArchivoTXTdeMLC file = new EscritorArchivoTXTdeMLC(ruta);

            this.nombreArchivo = file.GuardarArchivo(matrizMLC, nombreMLC);//guardo la matriz en el archivo y uso el nombre del archivo MLC para nombrarlo

        } catch (FileNotFoundException ex1) {
            throw ex1;
        } catch (IOException ex2) {
            throw ex2;
        } catch (Exception ex2) {
            throw ex2;
        }
    }

    /**
     * Boton Realizar Analisis, este boton realiza el analisis del campo y la
     * convolucion para generar la imagen del verificador, para luego ser
     * comparada con la dosis del Planificador.
     *
     * @param evt Ejecuta los hilos correspondientes a la ventana de espera
     * mientras esta realizando el procesamiento, y el hilo que va a ejecutar
     * los calculos en MatLab.
     */
    private void BotonEjecutarAnalisisActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonEjecutarAnalisisActionPerformed

        this.MensajesSistema.setText("Realizando análisis, por favor espere");
        this.MensajesSistema.setForeground(Color.RED);
    
        try {
            this.generarArchivoTXT();
          
            HiloEspera hilo;
            hilo = new HiloEspera("Hilo", ruta, nombreArchivo, this);

        } catch (FileNotFoundException ex) {
            JOptionPane.showMessageDialog(this, "No se encuentra el archivo MLC seleccionado");
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(this, "No se puede escribir el archivo TXT");
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }//GEN-LAST:event_BotonEjecutarAnalisisActionPerformed
    /*
     * Abre archivos del tipo mlc o ppf para tomar informacion del tratamiento del paciente
     */
    private void BotonAbrirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonAbrirActionPerformed
        JFileChooser abrir = new JFileChooser();
        //Filtro para que solamente se abran archivos ppf
        FileNameExtensionFilter filtro = new FileNameExtensionFilter("Solo archivos PPF", "ppf");
        abrir.setFileFilter(filtro);

        abrir.setMultiSelectionEnabled(false);
        int respuesta = abrir.showOpenDialog(this);
        //Comprobar si se ha pulsado Aceptar
        if (respuesta == JFileChooser.APPROVE_OPTION) {
            //Crear un objeto File con el archivo elegido
            this.archivoElegido = abrir.getSelectedFile();
            this.nombrePPF = archivoElegido.getName();
            this.ArchPPFElegido.setForeground(Color.BLACK);
            this.ArchPPFElegido.setText("Archivo PPF: " + archivoElegido.getName());//Muestro el nombre del archivo elegido en la pantalla
            this.ruta = archivoElegido.getParent();
            LectorArchivoPPF lector = new LectorArchivoPPF(archivoElegido.getPath());
            this.matrizPPF = lector.AbrirArchivo();
            //Seteo los jtextfield con los valores correspondientes al paciente elegido
            this.nombrePacienteEdit.setText(lector.getNombrePaciente());
            this.nombrePaciente.setEnabled(true);
            this.idPacienteEdit.setText(lector.getIdPaciente());
            this.idPaciente.setEnabled(true);
            this.diagPacienteEdit.setText(lector.getDiagnosis());
            this.diagPaciente.setEnabled(true);
            this.fechaDiagEdit.setText(lector.getDatePlan());
            this.fechaDiagPaciente.setEnabled(true);
            this.equipoPacienteEdit.setText(lector.getEquipo());
            this.equipoPaciente.setEnabled(true);
            this.dCorrectionEdit.setText(lector.getD_correction());
            this.dCorrectionPaciente.setEnabled(true);
            if ((lector.getD_correction().contains("OFF"))) {
                JOptionPane.showMessageDialog(this, "Warning: Density Correction OFF");
                this.dCorrectionEdit.setForeground(Color.red);
            } else {
                this.dCorrectionEdit.setForeground(Color.black);
            }
            //Seteo la cantidad de elementos del combobox segun la cantidad de campos en el tratamiento
            this.Campos.removeAllItems();
            int i = 0;
            for (i = 1; i <= lector.getFields(); i++) {
                this.Campos.addItem(i);
            }
            this.Campos.setEnabled(true);
            this.SelectCampos.setEnabled(true);
            //En base al nombre del PPF armo el nombre del MLC
            this.campoElegido = Campos.getSelectedIndex() + 1;
            this.nombreMLC = (archivoElegido.getName()).replace(".PPF", "_0" + (Campos.getSelectedIndex() + 1) + ".MLC");
            this.ArchMLCElegido.setText("Archivo MLC: " + nombreMLC);

            this.BotonEjecutarAnalisis.setEnabled(true);


        }//No se abre archivo
        else {
            if (this.archivoElegido == null) {
                this.ArchPPFElegido.setForeground(Color.red);
                this.ArchPPFElegido.setText("No se ha elegido archivo");
                this.BotonEjecutarAnalisis.setEnabled(false);
            }
    }//GEN-LAST:event_BotonAbrirActionPerformed
    }

    /*
     * Botón Ver Resultados, en donde muetra las matrices de las distintas
     * disposiciones de los colimadores, sus respestectivas UM que se aplican
     * en cada una de ellas y el resultado de la convolucion de las mismas, la
     * cual representa la aplicacion de la dosis correspondiente al campo 
     * seleccionado.
     */
    private void BotonResultadosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonResultadosActionPerformed

        ResultadosConvolucion res = new ResultadosConvolucion(this.ruta, this.nombreArchivo, this);
        this.setVisible(false);

    }//GEN-LAST:event_BotonResultadosActionPerformed

    private void ArchPPFElegidoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ArchPPFElegidoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_ArchPPFElegidoActionPerformed

    private void SelectCamposActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SelectCamposActionPerformed
    }//GEN-LAST:event_SelectCamposActionPerformed

    private void ArchMLCElegidoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ArchMLCElegidoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_ArchMLCElegidoActionPerformed

    private void CamposActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CamposActionPerformed
        if (this.archivoElegido != null) {
            this.nombreMLC = (archivoElegido.getName()).replace(".PPF", "_0" + (Campos.getSelectedIndex() + 1) + ".MLC");
            this.ArchMLCElegido.setText("Archivo MLC: " + nombreMLC);
            if (this.campoElegido != (Campos.getSelectedIndex() + 1)) {
                this.BotonResultados.setEnabled(false);//Linea agregada para que cuando se cambie de campo,
                //se deshabilite el botón "Ver Resultados".
            }
        }
    }//GEN-LAST:event_CamposActionPerformed

    private void CamposItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_CamposItemStateChanged
    }//GEN-LAST:event_CamposItemStateChanged

    private void CamposMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_CamposMouseClicked
    }//GEN-LAST:event_CamposMouseClicked

    private void ArchMLCElegidoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_ArchMLCElegidoMouseClicked
    }//GEN-LAST:event_ArchMLCElegidoMouseClicked

    private void MensajesSistemaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MensajesSistemaActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_MensajesSistemaActionPerformed

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        // TODO add your handling code here:
        setAlwaysOnTop(false);
        int eleccion = JOptionPane.showConfirmDialog(null, "¿Está seguro que desea cerrar el programa?", "Cerrando Sistema", 2);
        if (eleccion == 0) {
            System.exit(0);
        } else {
            setAlwaysOnTop(true);
            setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        }
    }//GEN-LAST:event_formWindowClosing

    /*
     * Función que es llamada por el hilo que ejecuta matlab para habilitar los botones correspondientes una
     * vez que corrió matlab sin errores
     */
    public void habilitarFuncionesMatlab() {
        this.MensajesSistema.setForeground(Color.BLACK);
        this.MensajesSistema.setText("CÁLCULOS REALIZADOS EXITOSAMENTE");//Muestro un mensaje de espere mientras se realizan los calculos  
        this.BotonResultados.setEnabled(true);
    }

    /*
     * Función que es llamada por el hilo que ejecuta matlab para mostrar un mensaje de error en la ventana principal
     * una vez que corrió matlab y se produjo error de conexion
     */
    public void errorMatlab() {
        this.MensajesSistema.setText("Verifique la instalación de Matlab");
    }
    private void TituloVentanaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_TituloVentanaActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_TituloVentanaActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>


        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Principal().setVisible(true);


            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextField ArchMLCElegido;
    private javax.swing.JTextField ArchPPFElegido;
    private javax.swing.JButton BotonAbrir;
    private javax.swing.JButton BotonEjecutarAnalisis;
    private javax.swing.JButton BotonResultados;
    private javax.swing.JComboBox Campos;
    private javax.swing.JTextField FirmaVentana;
    public javax.swing.JTextField MensajesSistema;
    private javax.swing.JTextField SelectCampos;
    private javax.swing.JTextField TituloVentana;
    private javax.swing.JTextField dCorrectionEdit;
    private javax.swing.JTextField dCorrectionPaciente;
    private javax.swing.JTextField diagPaciente;
    private javax.swing.JTextField diagPacienteEdit;
    private javax.swing.JTextField equipoPaciente;
    private javax.swing.JTextField equipoPacienteEdit;
    private javax.swing.JTextField fechaDiagEdit;
    private javax.swing.JTextField fechaDiagPaciente;
    private javax.swing.JTextField idPaciente;
    private javax.swing.JTextField idPacienteEdit;
    private javax.swing.JLabel image;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JSeparator jSeparator2;
    private javax.swing.JTextField nombrePaciente;
    private javax.swing.JTextField nombrePacienteEdit;
    // End of variables declaration//GEN-END:variables
}
